package com.qfmy.service.impl.assistant;

import com.qfmy.config.DashScopeConfig;
import com.qfmy.mapper.assistant.ImageMapper;
import com.qfmy.service.assistant.ImageService;
import common.exception.BaseException;
import common.login.LoginUser;
import common.login.LoginUserHolder;
import common.result.ResultCodeEnum;
import model.entity.assistant.Image;
import model.query.ImageQuery;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.springframework.ai.image.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * @author 清风明月
 * @Package com.qfmy.service.impl.assistant
 * @date 2025/5/19
 * @description 图像生成
 */
@Service
@SuppressWarnings("all")
public class ImageServiceImpl implements ImageService {

    /**
     * 注入dashcofig
     */
    @Autowired
    private DashScopeConfig dashScopeConfig;

    /**
     * 注入图片模型
     */
    @Autowired
    private  ImageModel imageModel;
    /**
     * 注入图片mapper
     */
    @Autowired
    private ImageMapper imageMapper;
    /**
     * 注入redisTemplate
     */
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    /**
     * 图像生成
     * @param query
     * @return
     */
    @Override
    public List<String> img(@NotNull ImageQuery image) {
        // 使用ImageOptionsBuilder构建ImageOptions对象，设置图片生成的参数
        ImageOptions options = ImageOptionsBuilder.builder()
                .withWidth(image.getWidth()) // 设置生成图片的宽度
                .withHeight(image.getHeight()) // 设置生成图片的高度
                .withModel(dashScopeConfig.getModelImage()) // 设置使用的模型名称
                .withN(2) // 设置生成图片的数量为2张
                .build();

        // 创建一个ImagePrompt对象，传入用户输入的内容和图片生成选项
        String prompts = "图片的描述: " +  image.getContent() + " 图片的类型: " +  image.getType();
        ImagePrompt prompt = new ImagePrompt(prompts, options);

        // 调用imageModel的call方法，传入prompt，获取图片生成的响应
        ImageResponse response = imageModel.call(prompt);

        // 获取响应中的图片生成结果列表
        List<ImageGeneration> results = response.getResults();

        // 创建一个列表，用于存储生成图片的URL
        List<String> imageUrls = new ArrayList<>();

        // 检查结果列表是否不为空
        if (!results.isEmpty()) {
            // 遍历结果列表中的每个ImageGeneration对象
            for (ImageGeneration result : results) {
                // 获取当前结果中图片的URL
                String imageUrl = result.getOutput().getUrl();
                // 将URL添加到imageUrls列表中
                imageUrls.add(imageUrl);
            }
        }
        // 返回包含所有生成图片URL的列表
        return imageUrls;
    }

    /**
     * 获取用户id
     * @return
     */
    @Override
    public List<Image> getImg() {
        Long userId = getUserId();
        return imageMapper.getImg(userId);
    }

    /**
     * 根据用户id查询图片
     * @param query
     * @return
     */
    @Override
    public List<Image> getImgByType(@NotNull ImageQuery query) {
        //计算分页
        Integer statr = getStart(query.getPageNum(), query.getSize());
        //设置分页
        query.setPageNum(statr);
        // 缓存键
        String cacheKey = "image:" + query.getType() + ":page:" + query.getPageNum();
        //从缓存里面获取数据
        List<Image> images = (List<Image>) redisTemplate.opsForValue().get(cacheKey);
        //判断是否存在
        if(images != null)
        {
            return images;
        }
        //查询数据
        List<Image> list = imageMapper.getImgByType(query);
        //保存到缓存
        redisTemplate.opsForValue().set(cacheKey,list,2, TimeUnit.HOURS);
        return list;
    }

    /**
     * 图片去水印
     * @param url
     * @return
     */
    @Override
    public String removeWatermark(String url) {

        return "";
    }


    /**
     * 计算分页
     * @param pageNum
     * @param size
     * @return
     */
    @Nullable
    @Contract(pure = true)
    private Integer getStart(Integer pageNum, Integer size) {
        if (pageNum == null || size == null) {
            size = 20;
            pageNum = 1;
        }
        return (pageNum - 1) * size;
    }

    /**
     * 获取用户id
     * @return
     */
    @Nullable
    @Contract(pure = true)
    private Long getUserId() {
        LoginUser loginUser = LoginUserHolder.getLoginUser();
        //判断是否登录
        if (loginUser == null) {
            throw new BaseException(ResultCodeEnum.TOKEN_INVALID);
        }
        return loginUser.getUserId();
    }
}
